/**
 * @addtogroup bsc_hj1239_chl_pack_if
 * bsc_hj1239_chl_pack_if
 * @{
 */
/**
 * @file        bsc_hj1239_chl_pack_if.h
 * @brief       XXXX
 * @note        XXXX
 * @author      靳普诏(puzhao.jin@hopechart.com)
 * @date        2023/10/18
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>2023/10/18   <td>1.0         <td>靳普诏       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BSC_HJ1239_CHL_PACK_IF_H_
#define _BSC_HJ1239_CHL_PACK_IF_H_


#include "gbmsg17691/gbc_17691_mgr.h"
#include "gbmsg17691/gbc_17691_ds_interface.h"
#include "gbmsg17691/gbc_17691_msg_gb.h"
#include "gbmsg17691/gbc_17691_msg_sd.h"

#include "bsc_hj1239/bsc_hj1239_chl_param_if.h"
#include "bsc_hj1239/bsc_hj1239_chl_session_if.h"
#include "bsc_hj1239_collect.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 服务器下行消息通知
 * @param self: 对象指针
 * @return
 */
typedef void(*TBsHj1239ChlCmdNotify)(void *receiver, UInt8 cmd, UInt8 *buf, Int32 buf_size);

typedef struct TBsHj1239ChlCmdNotifyEventTag TBsHj1239ChlCmdNotifyEvent;
struct TBsHj1239ChlCmdNotifyEventTag
{
    void *object;
    TBsHj1239ChlCmdNotify method;
};

typedef struct TBsHj1239ChlPackTage TBsHj1239ChlPack;
struct TBsHj1239ChlPackTage
{
PUBLIC
    TGbc17691Mgr mgr;       ///< 编码管理器
    Bool report_data_stream_history; ///< 是否登录后上报历史数据
    Bool report_obd_history;///< 是否登录后上报历史数据
    UInt8 report_history_duration;  ///< 上报历史数据判断时间
    UInt16 date_md;         ///< 日期月和日，1113,表示11月13日
    UInt8 logined_time[6];  ///< 登录时间
    IGbc17691DataStream ds_interface;
    IGbc17691Encrypt encrypt;

    IBsHj1239ChlParam     *chl_param_if;
    IBsHj1239ChlSession   *chl_session_if;

    TBsHj1239ChlCollect *collect;
};


typedef struct TBsHj1239ChlPackParamTag TBsHj1239ChlPackParam;
struct TBsHj1239ChlPackParamTag
{
    UInt8                 protocol_type;
    IBsHj1239ChlParam     *chl_param_if;        ///< 通道参数接口
    IBsHj1239ChlSession   *chl_session_if;      ///< 通道会话接口
    TBsHj1239ChlCollect   *collect;
};

/**
 * 打包对象创建方法
 * @param *self  对象指针
 * @param protocol_type  协议类型. @ref TGbc17691ProtocolEnum
 * @return 
 */
void TBsHj1239ChlPackCreate(TBsHj1239ChlPack *self, TBsHj1239ChlPackParam *param);

/**
 * 打包对象销毁方法
 * @param *self  对象指针
 * @return 
 */
void TBsHj1239ChlPackDestroy(TBsHj1239ChlPack *self);

/**
 * 设置数据解码通知事件
 * @param *self         对象指针
 * @param *user_param   用户指针
 * @param method        通知方法
 * @return 
 */
void TBsHj1239ChlPackSetRecvMsgNotify(TBsHj1239ChlPack *self, void *user_param, TGbc17691DoDecode method);

/**
 * 更新登录时间
 * @param *self  对象指针
 * @param login  变换为登录状态
 * @return 
 */
// void TBsHj1239ChlUpdataLoginTime(TBsHj1239ChlPack *self);

/**
 * 创建登入消息实体
 * @param self: 对象指针
 * @param time: 时间tick,指1970.01.01到现在的秒数
 * @param msg_login: 登入消息对象指针
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlCreateLogin(TBsHj1239ChlPack *self, TTime time, TGbc17691MsgLogin *msg_login);

/**
 * 登入消息组包
 * @param self: 对象指针
 * @param buf: 存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @param time_t: 时间tick,指1970.01.01到现在的秒数
 * @return >= 0  组包后的数据大小
 *         < 0   组包失败
 */
Int32 TBsHj1239ChlPackLogin(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size, TTime time);

/**
 * 创建登出消息实体
 * @param self: 对象指针
 * @param time: 时间tick,指1970.01.01到现在的秒数
 * @param msg_logout: 登入消息对象指针
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlCreateLogout(TBsHj1239ChlPack *self, TTime time, TGbc17691MsgLogout *msg_logout);

/**
 * 登出消息组包
 * @param self: 对象指针
 * @param buf: 存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @param time_t: 时间tick,指1970.01.01到现在的秒数
 * @return >= 0  组包后的数据大小
 *         < 0   组包失败
 */
Int32 TBsHj1239ChlPackLogout(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size, TTime time_t);

/**
 * 创建OBD和数据流消息
 * @param self: 对象指针
 * @param msg_stream: 数据流消息对象指针
 * @param stream_item: 数据项数组
 * @param item_count: 数据项个数
 * @param time: 时间tick,指1970.01.01到现在的秒数
 * @param upload_type: 上报类型,实时或者补传，参考TGbc17691UploadTypeEnum
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlCreateStream(TBsHj1239ChlPack *self, TGbc17691MsgStream *msg_stream, 
    TGbc17691MsgStreamItem *stream_item, UInt8 item_count, TTime time, UInt8 upload_type);

/**
 * OBD和数据流消息组包
 * @param self: 对象指针
 * @param buf: 存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @param stream_item: 数据项数组
 * @param item_count: 数据项个数
 * @param time_t: 时间tick,指1970.01.01到现在的秒数
 * @param upload_type: 上报类型,参考TGbc17691UploadTypeEnum
 * @return >= 0  组包后的数据大小
 *         < 0   组包失败
 */
Int32 TBsHj1239ChlPackStream(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size, TGbc17691MsgStreamItem *stream_item, UInt8 item_count, TTime time, UInt8 upload_type);

/**
 * 创建对时消息
 * @param self: 对象指针
 * @param msg_time: 对时消息对象指针
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlCreateCheckTime(TBsHj1239ChlPack *self, TGbc17691MsgCheckTime *msg_time);

/**
 * 对时消息组包
 * @param self: 对象指针
 * @param buf: 存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @return >= 0  组包后的数据大小
 *         < 0   组包失败
 */
Int32 TBsHj1239ChlPackCheckTime(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size);

/**
 * 数据流消息组包
 * @param self: 对象指针
 * @param max_nums: 最大条数
 * @param buf: 存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @param history: 是否是历史消息
 * @return >= 0  组包后的数据大小
 *         < 0   组包失败
 */
Int32 TBsHj1239ChlPackDataStream(TBsHj1239ChlPack *self, Bool force, UInt8 max_nums, UInt8 *buf, Int32 buf_size, Bool *history, UInt32 *reissue_count_);

/**
 * OBD消息组包
 * @param self: 对象指针
 * @param buf: 存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @param history: 是否是历史消息
 * @return >= 0  组包后的数据大小
 *         < 0   组包失败
 */
Int32 TBsHj1239ChlPackObdData(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size, UInt8 *history);
/**
 * 数据解码
 * @param self: 对象指针
 * @param buf: 待解码的数据缓存
 * @param buf_size: 缓存大小
 * @param remove_size: 解码后需要移除的大小
 * @return >= 0  为解析的消息长度
 *         < 0   负数为错误码，参考 TGbc17691ErrorCodeEnum
 */
Int32 TBsHj1239ChlPackParse(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size, Int32 *remove_size);

/**
 * 防拆报警数据包创建
 * @param *self 对象指针
 * @param time 时间 tick,指1970.01.01到现在的秒数
 * @param *msg
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlCreateBreakAlarm(TBsHj1239ChlPack *self, TTime time, TGbc17691MsgBreakAlarm *msg);

/**
 * 防拆报警数据组包
 * @param *self     对象指针
 * @param buf:      存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @param time      时间戳
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlPackBreakAlarm(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size, TTime time);

/**
 * 激活消息组包
 * @note 需要提前更新相关参数信息。
 * @param *self     对象指针
 * @param buf:      存放组包后的数据缓存
 * @param buf_size: 缓存大小
 * @param time      时间戳
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlPackRecord(TBsHj1239ChlPack *self, UInt8 *buf, Int32 buf_size, TTime time);



/**
 * 数据流编码
 * @note 自动识别历史数据或实时数据，每包中数据类型相同
 * @param *self     对象指针
 * @param queue_id  存放数据的队列id
 * @param max_nums  最大数据条数
 * @param *buf      编码缓存地址
 * @param buf_size  编码缓存大小
 * @param *history  True 为历史数据；False 为实时数据
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlPackRealData(TBsHj1239ChlPack *self, UInt16 queue_id, UInt8 max_nums, UInt8 *buf, Int32 buf_size, Bool *history);
Int32 TBsHj1239ChlPackRealDataRetNums(TBsHj1239ChlPack *self, UInt16 queue_id, UInt8 *max_nums, UInt8 *buf, Int32 buf_size, Bool *history);


/**
 * 数据流编码
 * @note 自动识别历史数据或实时数据，每包中数据类型相同
 * @param *self     对象指针
 * @param queue_id  存放数据的队列id
 * @param mask      上报掩码
 * @param max_nums  最大数据条数
 * @param *buf      编码缓存地址
 * @param buf_size  编码缓存大小
 * @param *history  True 为历史数据；False 为实时数据
 * @return == 0  成功
 *         <  0  失败
 */
Int32 TBsHj1239ChlPackRealDataByMask(TBsHj1239ChlPack *self, UInt16 queue_id, UInt32 mask, UInt8 max_nums, UInt8 *buf, Int32 buf_size, Bool *history);
Int32 TBsHj1239ChlPackRealDataRetNumsByMask(TBsHj1239ChlPack *self, UInt16 queue_id, UInt32 mask, UInt8 *max_nums, UInt8 *buf, Int32 buf_size, Bool *history);

#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif  ///< _BSC_HJ1239_CHL_PACK_IF_H_

/**
 * @}  Generated on "2023-10-18 23:48:14" by the tool "gen_hq_file.py >> V20230509_1" 
 */
